package eva.savant.business.contabilidad.view

import eva.savant.business.contabilidad.service.TSContabilidad
import eva.savant.businessobject.cg.Asiento
import eva.savant.businessobject.cg.Cuenta
import eva.savant.businessobject.cg.Partida
import eva.savant.businessobject.gl.Tipo
import eva.savant.core.view.Bean

import javax.faces.bean.ManagedBean
import javax.faces.bean.SessionScoped
import javax.annotation.PostConstruct
import javax.faces.convert.Converter
import org.primefaces.event.SelectEvent

@SessionScoped
@ManagedBean(name = 'ITAsiento')
public class ITAsiento extends Bean {

  def lsTipo

  def debe, haber

  Partida partida

  Date dateIni, dateEnd

  TSContabilidad tsContabilidad

  @PostConstruct
  public void cleanEntity() {

    focus= 'ps:cuentaId:complete'

    if(dateIni==null) dateIni = dateEnd= new Date()

    tsContabilidad= (TSContabilidad) getSpringBean('tsContabilidad')


    entity= new Asiento(); init()

    entity.fecha= new Date()

    entity.tipo= new Tipo()

    entity.lsPartida= new ArrayList<Partida>()

    entity.importe = debe = haber = 0


    partida= new Partida()

    partida.cuenta= new Cuenta()


    lsTipo= find(Tipo,'clase.codigo=?','CC')
  }

  public List findLsEntity() {

    return find(Asiento,'fecha between ? and ? order by id desc', dateIni,toMidnight(dateEnd))
  }

  public void editEntity(Object id) {

    //isRead= true

    entity= get(Asiento, id); detailSum()
  }

  public void detailAdd() {

    if(partida.cuenta?.id == null) { addErrorMessage 'Debe seleccionar una cuenta contable'; return; }


    def p= new Partida()

    p.cuenta= partida.cuenta

    p.debe  = partida.debe

    p.haber = partida.haber

    p.glosa = partida.glosa


    def nuevo= true; for(int i=0; i < entity.lsPartida.size(); i++) { def x= entity.lsPartida.get(i)

    if(x.cuenta.id.equalsIgnoreCase(p.cuenta.id)) { entity.lsPartida.set(i,p); nuevo= false; break }  }

    if(nuevo) entity.lsPartida.add(p); detailSum()


    partida= new Partida()

    partida.cuenta= new Cuenta()


    focus= 'ps:cuentaId:complete'
  }

  public void detailEdit(SelectEvent event) {

    if(isRead) return

    def p= (Partida) event.object

    partida       = new Partida()

    partida.cuenta= p.cuenta

    partida.debe  = p.debe

    partida.haber = p.haber

    partida.glosa = p.glosa

    focus= 'ps:cuentaId:complete'
  }

  public void detailDelete(Partida partida) {

    if(isRead) return

    for(int i=0; i < entity.lsPartida.size(); i++) { def p= entity.lsPartida.get(i)

    if(p.cuenta.id.equalsIgnoreCase(partida.cuenta.id)) { entity.lsPartida.remove(i); break }  }

    detailSum()
  }

  public void detailSum() {

    debe = haber = 0; entity.lsPartida.each { debe= debe + it.debe; haber= haber + it.haber }
  }

  public boolean mergeEntity(Object entity) { alta((Asiento)entity); entity= (Asiento) entity

    if(entity.lsPartida?.size() < 1) { addErrorMessage 'El detalle cuentas esta vacio'; return false }

    if(debe != haber) { addErrorMessage 'Los valores del debe y el haber no son iguales'; return false }

    entity.importe= haber

    return tsContabilidad.mergeAsiento(entity)
  }

  public List complete(String value) { return completeLike(Cuenta,'tipo= 0 and nombre',value) }

  public Converter getConverter() { return converterLike(Cuenta) }

}
